#!/usr/bin/env python
# -*- coding: utf-8 -*-

# @Time     :2020/10/08
# @Author   :Changshu
# @File     :practice_231.py

# 231. 2的幂
# 给定一个整数，编写一个函数来判断它是否是 2 的幂次方。

'''
	解法一：找规律
		1(d) : 0001(b)
		2(d) : 0010(b)
		4(d) : 0100(b)
		8(d) : 1000(b)
		16(d): 10000(b)
		.......
		不难发现，所有的二次幂数的二进制数都只在最高位有1，其余都是0，那么n&(n-1)=0


def isPowerOfTwo(n:int)->bool:
	if n<=0:
		return False
	return True if n&(n-1)==0 else False
'''

'''
	解法二：
		如果是二次幂数，那么n&(-n)==n一定成立
		8&(-8) = 0001000 & 1111000 = 0001000=8
		6&(-6) = 0000110 & 1111010 = 0000010=2

def isPowerofTwo(n:int)->bool:
	return n>0 and n&(-n)==n
'''

'''
	解法三：
		使用一个巨大的二次幂数对n取余，如果为0就说明n是二次幂数，反之则不然
'''
def isPowerofTwo(n:int)->bool:
	return n>0 and (1<<30)%n==0


if __name__ == '__main__':
	n=128
	b=isPowerofTwo(n)
	print(b)